package com.ctshk.rpc.order.tour.service;


import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.order.tour.dto.*;
import com.ctshk.rpc.order.tour.dto.custom.CustomOrderTouristInfoListCollectionDTO;
import com.ctshk.rpc.order.tour.dto.custom.CustomOrderTouristInfoPreviewInvoiceDTO;
import com.ctshk.rpc.order.tour.dto.custom.ScheduleOrderPeopleDTO;
import com.ctshk.rpc.order.tour.req.*;
import com.ctshk.rpc.order.tour.req.custom.CustomOrderIdReq;
import com.ctshk.rpc.order.tour.vo.ExcelData;
import com.ctshk.rpc.order.tour.vo.ExcelTemp;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 系列团游客信息 服务类
 * </p>
 *
 * @author 谭响
 * @since 2021-01-18
 */
public interface ISeriesOrderTouristInfoService {

    /**
     * 插入批量
     */
    void insertBatch(SeriesOrderTouristInfoInsertBatchReq req);

    /**
     * 保存批量
     */
    Boolean saveBatch(List<SeriesOrderTouristInfoSaveBatchReq> listReq);

    /**
     * 编辑
     */
    Result<SeriesOrderDTO> edit(SeriesOrderTouristInfoEditReq seriesOrderTouristInfoEditReq);

    /**
     * 列表
     */
    PageResponse<SeriesOrderTouristInfoDTO> list(SeriesOrderTouristInfoListReq seriesOrderTouristInfoEditReq);

    /**
     * 列表收款
     */
    PageResponse<CustomOrderTouristInfoListCollectionDTO> listCollection(CustomOrderIdReq req);

    /**
     * 列表收款团期
     */
    PageResponse<SeriesOrderTouristInfoListCollectionTripDTO> listCollectionTrip(SeriesOrderTouristInfoListCollectionTripReq req);

    /**
     * 添加
     */
    Result add(SeriesOrderTouristInfoAddReq seriesOrderTouristInfoAddReq);

    /**
     * Excel添加
     */
    Result excelAdd(List<SeriesOrderTouristInfoExcelAddReq> reqList, SeriesOrderTouristInfoExcelAddReq req);

    /**
     * 删除
     */
    Result delete(SeriesOrderTouristInfoDeleteReq req);

    /**
     * 旅客名单
     */
    PageResponse<SeriesOrderTouristNameListDTO> nameList(SeriesOrderTouristNameListReq touristNameListReq);


    /**
     * 旅客分组分房查询
     */
    PageResponse<SeriesOrderTouristRoomGroupDTO> queryList(SeriesOrderTouristRoomReq roomReq);

    /**
     * 旅客noShow
     */
    Result noShow(SeriesOrderTouristNoShowReq req);

    /**
     * 旅客lockStatus
     */
    Result lockStatus(SeriesOrderTouristNoShowReq req);

    /**
     * 旅客分组
     */
    Result group(SeriesRoomGroupReq roomGroupReq);

    /**
     * 旅客分房
     */
    Result updateRoom(SeriesRoomRoomReq roomReq,Long userId);

    List<SeriesOrderTouristRoomDTO> roomList(SeriesOrderTouristRoomReq roomReq);

    /**
     * 获取团信息
     * @param id
     * @return
     */
    SeriesGroupTouristInfoDTO groupInfo(Long id);

    /**
     * 根据团期id查询组信息
     *
     * @param id 团期id
     * @return 组信息
     */
    Result<List<SeriesOrderTouristGroupDTO>> queryGroup(Long id);

    /**
     * 新增游客分组
     *
     * @param scheduleId 团期id
     * @return 返回值
     */
    Result addGroup(Long scheduleId,Long userId);

    /**
     * 删除游客分组
     *
     * @param groupId 分组id
     * @return 返回值
     */
    Result deleteGroup(Long groupId,Long userId);

    /**
     * 移除分组下的游客
     *
     * @param req req
     * @param userId
     * @return 返回值
     */
    Result removeGroupTourist(RemoveGroupTouristReq req,Long userId);
    /**
     * 详情
     */
    Result<SeriesOrderTouristInfoDetailDTO> detail(SeriesOrderTouristInfoDetailReq req);


    /**
     * 预览发票
     */
    Result<CustomOrderTouristInfoPreviewInvoiceDTO> previewInvoice(SeriesOrderTouristInfoPreviewInvoiceReq req, TokenUser currentUser);
    
    /**
     * 增加某旅客的调整费用
     * @param touristId
     * @param amount 增加的金额，可为负
     */
    void addTouristAdjustmentAmount(Long touristId, BigDecimal amount, Long userId);

    /**
     * 获取房间数范围
     * @param req
     * @return
     */
    Result<SingleRoomCalculateDTO> calculate(SingleRoomCalculateReq req);

    /**
     * 统计已下单人数(内部接口)
     * @param scheduleDTOList
     * @return
     */
    List<ScheduleOrderPeopleDTO> sumOrderPeople(List<ScheduleOrderPeopleDTO> scheduleDTOList);

    /**
     * 获取国籍ID
     * @param nation
     * @return
     */
    Long getNationId(String nation);

    /**
     * 获取证件类型ID
     * @param stringCellValue
     * @return
     */
    Long getCertificateTypeId(String stringCellValue);

    /**
     * 导入旅客名单
     * @param tempList
     * @param userId
     * @param orderId
     * @return
     */
    Result exportIn(List<ExcelTemp> tempList, Long userId, Long orderId);

    /**
     * 导出旅客模板
     * @param req
     * @return
     */
    ExcelData exportOut(CustomOrderIdReq req);
}
